/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：太平金科-基础组件封装层-SpringBoot组件封装-缺省实现
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taipingframework.boot.web.components;

import com.taipingframework.utility.context.SpringContextHolder;
import com.taipingframework.utility.thread.threadfactory.SmartThreadFactory;
import com.taipingframework.boot.web.constant.SpringRunnerOrderEnum;
import com.taipingframework.boot.web.startup.CommandLineRunnerStartup;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.Objects;
import java.util.concurrent.Executors;

/**
 * 容器启动完成的时候执行，可以有多个。
 * CommandLineRunner接口的run()方法接收String数组作为参数，即是最原始的参数，没有做任何处理；
 */
@Slf4j
@Component
public class ApplicationCmdLineRunner implements CommandLineRunner, Ordered {
    @Override
    public void run(String... args) throws Exception {
        String argStr = Arrays.toString(args);

        ApplicationContext applicationContext = SpringContextHolder.getApplicationContext();
        String applicationName = applicationContext.getId();
        log.debug("------- SpringBoot工程 " + applicationName + " 启动参数{}" + " ------- 开始执行初始化工作！！！", argStr);

        // 执行 SpringBoot工程启动之后的初始化工作
        CommandLineRunnerStartup startup = applicationContext.getBean(CommandLineRunnerStartup.class);
        if (Objects.isNull(startup)) {
            return;
        }
        SmartThreadFactory threadFactory = new SmartThreadFactory(String.valueOf(applicationName).split("-")[1]);
        Executors.newCachedThreadPool(threadFactory).execute(() -> startup.commandLineInitHandler(applicationContext));
    }

    @Override
    public int getOrder() {
        return SpringRunnerOrderEnum.ORDER_APPLICATION_CMD_LINE_RUNNER.getOrdered();
    }
}
